﻿using MahApps.Metro.Controls;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace LunarSF.SHomeWorkshop.LunarMarkdownEditor
{
    /// <summary>
    /// DictionaryEditor.xaml 的交互逻辑
    /// </summary>
    public partial class DictionaryEditor : MetroWindow
    {
        /// <summary>
        /// [构造方法]创建一个词典编辑器。
        /// </summary>
        /// <param name="dictionaryFilePath"></param>
        public DictionaryEditor(string dictionaryFilePath)
        {
            InitializeComponent();

            this.dictionaryFilePath = dictionaryFilePath;

            if (File.Exists(dictionaryFilePath) == false) throw new FileNotFoundException($"文件“{dictionaryFilePath}”不存在。");

            using (StreamReader sr = new StreamReader(dictionaryFilePath))
            {
                char[] splitter = new char[] { '\t' };
                var lineText = sr.ReadLine();
                ObservableCollection<EnToChEntry> dictionaryEntries = new ObservableCollection<EnToChEntry>();

                while (lineText != null)
                {
                    if (lineText.StartsWith(";") || lineText.StartsWith("；"))
                    {
                        lineText = sr.ReadLine();
                        continue;
                    }

                    var spans = lineText.Split(splitter, StringSplitOptions.RemoveEmptyEntries);

                    EnToChEntry ece = new EnToChEntry();

                    var i = 0;
                    if (i < spans.Length) ece.English = spans[i];
                    i++;
                    if (i < spans.Length) ece.Chinese = spans[i];
                    i++;
                    if (i < spans.Length) ece.Alpha = spans[i];
                    i++;
                    if (i < spans.Length) ece.Comment = spans[i];

                    dictionaryEntries.Add(ece);
                    lineText = sr.ReadLine();
                }

                dg.DataContext = dictionaryEntries;
            }
        }

        private string dictionaryFilePath;
        /// <summary>
        /// 词典文件路径。
        /// </summary>
        public string DictionaryFilePath
        {
            get { return dictionaryFilePath; }
        }

        /// <summary>
        /// 放弃编辑结果，关闭窗口。
        /// </summary>
        private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
            this.Close();
        }

        /// <summary>
        /// 保存编辑的结果。
        /// </summary>
        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                StringBuilder sb = new StringBuilder();

                foreach (var row in dg.DataContext as ObservableCollection<EnToChEntry>)
                {
                    sb.Append(row.English);
                    sb.Append("\t");
                    sb.Append(row.Chinese);
                    sb.Append("\t");
                    sb.Append(row.Alpha);
                    sb.Append("\t");
                    sb.Append(row.Comment);
                    sb.Append("\r\n");
                }

                using (StreamWriter sw = new StreamWriter(this.DictionaryFilePath))
                {
                    sw.Write(sb.ToString());
                }
                this.DialogResult = true;
            }
            catch (Exception ex)
            {
                this.DialogResult = false;
                LMessageBox.Show(ex.Message, Globals.AppName, MessageBoxButton.OK, MessageBoxImage.Error);
            }
            finally
            {
                this.Close();
            }
        }

        /// <summary>
        /// 使行标头都加上前缀文本，好看点。
        /// </summary>
        private void dg_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.Header = ">>";
        }

        /// <summary>
        /// 显示状态栏信息。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dg_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
        {
            if (e.AddedCells.Count <= 0)
            {
                tbStatus.Text = $"共 {dg.Items.Count} 行。";
                return;
            }

            tbStatus.Text = $"第 {dg.Items.IndexOf(e.AddedCells[0].Item) + 1} 行，共 {dg.Items.Count} 行。";
        }
    }
}
